﻿package com.Galaxisfarm {
	// Bibliotecas da game engine Flixel
	import com.adamatomic.flixel.*;
	import flash.geom.Point;
	
	public class PhaseThreeState extends PhaseState {
		// Variável que indica se houver colisão
		private var _has_overlap:Boolean;
		// Curral
		private var _freestall_phase:Freestall;
		
		// Método construtor
		public function PhaseThreeState():void {
			// Chama o construtor da classe herdada
			super();
			
			// Roda o script lua
			runScriptLua("phase_three.lua");
			
			// Adiciona o celeiro
			addCowshed();
			
			// Mensagem de instrução
			dialogBoxDefault("Fase 3\nSeu objetivo é construir o curral.");
			
			// Animações do curral
			_freestall_phase = new Freestall(20, 20, FlxG.mouse);
			_freestall_phase.visible = false;
			_lyr_sprites.add(_freestall_phase);
			
			// Cria o curral e deixa oculto
			createFreestallHidden();
			
			addVersionBeta();
		}
		
		// Método chamado constantemente
		override public function update():void {
			super.update();
			
			// Verifica se o curral acabou de ser
			// adicionado no cenário
			var addFreestallNow:Boolean = false;
			
			// Verifica se o botão para adicionar
			// o curral foi criado
			if (_button_add_freestall != null) {
				// Verifica se o botão foi pressionado
				if (_button_add_freestall.on()) {
					// Curral já foi criado
					if (_freestall.visible) {
						// Remove o curral
						_freestall.visible = false;
						
						// Aumenta o valor do curral no dinheiro
						Farm.setMoney(Farm.getMoney() + getFreestallPrice());
					} else {
						// Obtém as árvores criadas
						var trees:FlxArray = Farm.getTrees();
					
						// Verifica se houve colisão
						_has_overlap = false;
						for each (var tree:* in trees) {
							for each (var freestall_point:Point in _freestall_phase.getCollidePoints()) {
								if (tree.overlapsPoint(freestall_point.x, freestall_point.y, false)) {
									_has_overlap = true;
									break;
								}
							}
						}
					
						if (!_has_overlap) {
							// Verifica se existe colisão com o painel de ação
							if (_action_panel != null) {
								if (_freestall_phase.overlaps(_action_panel)) {
									_has_overlap = true;
								}
							}
							
							// Verifica se existe colisão com o celeiro
							if (_freestall_phase.overlaps(_cowshed)) {
								for each (freestall_point in _freestall_phase.getCollidePoints()) {
									if (_cowshed.overlapsPoint(freestall_point.x, freestall_point.y, true)) {
										_has_overlap = true;
										break;
									}
								}
							}
						}
						
						// Exibe o curso com o curral
						// no caso de colisão ou não
						if (_has_overlap) {
							_freestall_phase.play("not");
						} else {
							_freestall_phase.play("selected");
						}
						_freestall_phase.visible = true;
						
						// Captura o click do mouse
						// e não houve colisão do celeiro com as árvores
						if (FlxG.justPressed(FlxG.MOUSE) && !_has_overlap) {
							if (!_freestall.visible) {
								// Verifica se tem dinheiro suficiente para construir o curral
								if ((Farm.getMoney() - getFreestallPrice()) > 0) {
									_freestall.x = _freestall_phase.x;
									_freestall.y = _freestall_phase.y;
									_freestall.play("normal");
									_freestall.visible = true;
									_button_add_freestall.switchOff();
									addFreestallNow = true;
									
									// Diminui o valor do curral no dinheiro
									Farm.setMoney(Farm.getMoney() - getFreestallPrice());
								} else {
									// Exibe mensagem de dinheiro insuficiente
									dialogBoxError("Você não possui dinheiro\nsuficiente para construir\no curral.");
								}
							}
						}
						
						// Atualiza posição do sprinte pelo deslocamento do mouse
						_freestall_phase.updatePositionByMouse();
					}
				} else {
					// Se o botão não estiver pressionado
					// esconde os cursores do mouse
					_freestall_phase.visible = false;
				}
			}
			
			// Verifica se o foi clicado no curral
			// para mudar a sua posição
			if (!addFreestallNow) {
				if (FlxG.justPressed(FlxG.MOUSE) && _freestall.visible && _freestall.overlapsPoint(FlxG.mouse.x, FlxG.mouse.y)) {
					_button_add_freestall.switchOn();
					_freestall.visible = false;
					
					// Aumenta o valor do curral no dinheiro
					Farm.setMoney(Farm.getMoney() + getFreestallPrice());
				}
			}
		}
		
		// Método que cria o botão concluído
		public function createButtonCompleted(X:uint, Y:uint):void {
			var buttonCompleted:FlxButton = new FlxButton(
				X, 
				Y, 
				new FlxSprite(null, 0, 0, false, false, 65, 18, 0xff25155E), 
				onClickButtonCompleted, 
				new FlxSprite(null, 0, 0, false, false, 65, 18, 0xffE46713), 
				new FlxText(0, 1, 65, 18, "Concluído", 0xffffff, null, 10, "center"),
				new FlxText(0, 1, 65, 18, "Concluído", 0xffffff, null, 10, "center"));
			_lyr_sprites.add(buttonCompleted);
		}
		
		// Método chamado quando o botão de
		// concluído é clicado
		private function onClickButtonCompleted():void {
			// Verifica se foi construído o curral
			if (!_freestall.visible) {
				dialogBoxError("Você deve construir o curral.");
			} else {
				// Define o curral na fazenda
				Farm.setFreestall(_freestall);
				
				// Vai para terceira fase
				FlxG.switchState(PhaseFourthState);
			}
		}
	}
}